#include <stdint.h>
#include <stddef.h>
#include <ctype.h>
#include <string.h>
#include <riscv.h>

#include <printk.h>
#include <interrupt.h>

void enable_irq_cpu(int32_t irq)
{
	set_csr(mie, 1 << irq);
}

void disable_irq_cpu(int32_t irq)
{
	uint32_t value = 0;
	value = read_csr(mie);
	value &= ~(1 << irq);
	set_csr(mie, value);
}

/**
  CPU 中断分发函数，由汇编调用，属于CPU一级中断处理函数.
  该函数为通用处理函数，可以在soc级别进行优化.
  */
__attribute__((weak)) void exc_handler(void)
{
	uint32_t cause, mip, mie;
	uint32_t pending = 0;
	int32_t i;
	cause = read_csr(mcause);
	if (cause >> 31) {
		mip = read_csr(mip);
		mie = read_csr(mie);
		pending = mie & mip;
		/*通用中断回调处理.*/
		for (i = 0; i < 32; i++) {
			if ((pending & (1 << i))) {
				handle_irq(IRQ_CPU_BASE + i);
			}
		}
	} else {
		/* TODO */
		//printk("mcause = %x\n", cause);
		mip = read_csr(mip);
		//printk("mip = %x\n", mip);
	}
}



/* 初始化异常向量表. */
void trap_init(void)
{
	/* 向量表初始化由start.S完成 */
}
